home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-02-19 | 16.9 KB | 495 lines | [TEXT/CWIE] |
-
- #include "AbstractIterator.h"
- #include "AbstractScriptableObject.h"
- #include "AbstractCollector.h"
- #include "AbstractSearchSpec.h"
-
- #include "Exceptions.h"
-
- //
- // For TDeepIterator
- //
- #include "EntireContents.h"
-
- //
- // For CopyMemory
- //
- #include "AbstractData.h"
-
- //========================================================================================
- // CLASS TAbstractObjectIterator
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::~TAbstractObjectIterator
- //----------------------------------------------------------------------------------------
- TAbstractObjectIterator::~TAbstractObjectIterator()
- {
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::Dispose
- //----------------------------------------------------------------------------------------
- void TAbstractObjectIterator::Release()
- {
- delete this;
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::RemoveCurrent
- //----------------------------------------------------------------------------------------
- void TAbstractObjectIterator::RemoveCurrent(const TAETransaction&)
- {
- FailErr(errAEEventNotHandled);
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::CurrentDerivedFromOSLClass
- //
- // Override to avoid creating a designator just to compare the object class of
- // the current item.
- //----------------------------------------------------------------------------------------
- Boolean TAbstractObjectIterator::CurrentDerivedFromOSLClass(const TAETransaction& t, DescType objectClass)
- {
- TAbstractScriptableObject* current = this->Current(t);
- Boolean isDerived = false;
-
- if(current != nil)
- {
- isDerived = current->DerivedFromOSLClass(t, objectClass);
- current->DisposeDesignator();
- }
-
- return isDerived;
- } // TAbstractObjectIterator::CurrentDerivedFromOSLClass
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::CountElements
- //----------------------------------------------------------------------------------------
- long TAbstractObjectIterator::CountElements(const TAETransaction& t, DescType desiredClass)
- {
- long count = 0;
-
- for(this->Reset(t); this->More(t); this->Next(t))
- {
- if(this->CurrentDerivedFromOSLClass(t, desiredClass))
- {
- ++count;
- }
- }
-
- return count;
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::GetIndexedElement
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TAbstractObjectIterator::GetIndexedElement(const TAETransaction& t, DescType desiredClass, long index)
- {
- TAbstractScriptableObject* result = nil;
-
- for(this->Reset(t); this->More(t); this->Next(t))
- {
- if(this->CurrentDerivedFromOSLClass(t, desiredClass))
- {
- --index;
- if(index == 0)
- {
- result = this->Current(t);
- break;
- }
- }
- }
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::GetNamedElement
- //
- // It is only necessary to override this method to improve the performance
- // of access by name
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TAbstractObjectIterator::GetNamedElement(const TAETransaction& t, DescType desiredClass, TDescriptor nameDesc)
- {
- TAbstractScriptableObject* result = nil;
-
- for(this->Reset(t); this->More(t); this->Next(t))
- {
- TAbstractScriptableObject* token = this->Current(t);
- if(token->DerivedFromOSLClass(t, desiredClass))
- {
- Boolean match = token->CompareProperty(t, pName, kAEEquals, nameDesc);
- if(match)
- {
- token->AddThisToMarkToken(result, kSingleItemOrUnion);
- token = nil;
- }
- }
- if(token != nil)
- {
- token->DisposeDesignator();
- token = nil;
- }
- }
-
- return result;
- } // TAbstractObjectIterator::GetNamedElement
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::AccessBySearchSpec:
- //----------------------------------------------------------------------------------------
- void TAbstractObjectIterator::AccessBySearchSpec(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec)
- {
- Boolean iterationDirection = collector->CollectorRequest(t, kSearchShouldIterateBackwards) ? kBackwardIteration : kForwardIteration;
- for(this->Reset(t, iterationDirection); this->More(t) && (collector->CollectorRequest(t, kCollectionIsFull) == false); this->Next(t))
- {
- OSErr err = noErr;
-
- Try
- {
- TAbstractScriptableObject* token = this->Current(t);
- if(token->DerivedFromOSLClass(t, desiredClass) && searchSpec->Compare(t, token))
- collector->AddToCollection(token);
- else
- token->DisposeDesignator();
- token = nil;
- }
- Catch(err)
- {
- }
- }
- } // TAbstractObjectIterator::AccessBySearchSpec
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::SearchDeep
- //----------------------------------------------------------------------------------------
- void TAbstractObjectIterator::SearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec)
- {
- TDeepIterator deepIter(nil);
-
- for(this->Reset(t); this->More(t); this->Next(t))
- {
- OSErr err = noErr;
-
- Try
- {
- TAbstractScriptableObject* elementToDeepSearch = this->Current(t);
- deepIter.FocusOnNewRoot(elementToDeepSearch);
-
- for(deepIter.Reset(t); deepIter.More(t); deepIter.Next(t))
- {
- Try
- {
- TAbstractScriptableObject* token = deepIter.Current(t);
- if(token->DerivedFromOSLClass(t, desiredClass) && searchSpec->Compare(t, token))
- collector->AddToCollection(token);
- else
- token->DisposeDesignator();
- token = nil;
- }
- Catch(err)
- {
- }
- }
-
- if(elementToDeepSearch->DerivedFromOSLClass(t, desiredClass) && searchSpec->Compare(t, elementToDeepSearch))
- collector->AddToCollection(elementToDeepSearch);
- else
- elementToDeepSearch->DisposeDesignator();
- }
- Catch(err)
- {
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::RecursiveSearchDeep
- //----------------------------------------------------------------------------------------
- void TAbstractObjectIterator::RecursiveSearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec)
- {
- for(this->Reset(t); this->More(t); this->Next(t))
- {
- OSErr err = noErr;
-
- Try
- {
- TAbstractScriptableObject* token = this->Current(t);
- TAbstractObjectIterator* elementIter = token->ElementIterator(t);
- elementIter->SearchDeep(t, collector, desiredClass, searchSpec);
- if(token->DerivedFromOSLClass(t, desiredClass) && searchSpec->Compare(t, token))
- collector->AddToCollection(token);
- else
- token->DisposeDesignator();
- elementIter->Release();
- elementIter = nil;
- token = nil;
- }
- Catch(err)
- {
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TAbstractObjectIterator::Contains
- //----------------------------------------------------------------------------------------
- Boolean TAbstractObjectIterator::Contains(const TAETransaction& t, TAbstractScriptableObject* objectToTestForMembership)
- {
- Boolean isContained = false;
-
- for(this->Reset(t); this->More(t) && (isContained == false); this->Next(t))
- {
- TAbstractScriptableObject* current = this->Current(t);
- isContained = current->ObjectsAreTheSame(t, objectToTestForMembership);
- current->DisposeDesignator();
- }
-
- return isContained;
- }
-
- //========================================================================================
- // Class TSingleObjectIterator
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::~TSingleObjectIterator
- //----------------------------------------------------------------------------------------
- TSingleObjectIterator::~TSingleObjectIterator()
- {
- } // TSingleObjectIterator::~TSingleObjectIterator
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::Reset
- //----------------------------------------------------------------------------------------
- void TSingleObjectIterator::Reset(const TAETransaction&, Boolean)
- {
- fCurrent = fObject;
- } // TSingleObjectIterator::Reset
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::More
- //----------------------------------------------------------------------------------------
- Boolean TSingleObjectIterator::More(const TAETransaction&) const
- {
- return (fCurrent != nil);
- } // TSingleObjectIterator::More
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::Next
- //----------------------------------------------------------------------------------------
- void TSingleObjectIterator::Next(const TAETransaction&)
- {
- fCurrent = nil;
- } // TSingleObjectIterator::Next
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::Current
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TSingleObjectIterator::Current(const TAETransaction&)
- {
- return fCurrent->CloneDesignator();
- } // TSingleObjectIterator::Current
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::CountElements
- //
- // We know that this iterator will only represent one object at the most
- //----------------------------------------------------------------------------------------
- long TSingleObjectIterator::CountElements(const TAETransaction& t, DescType desiredClass)
- {
- return fObject == nil ? 0 : fObject->DerivedFromOSLClass(t, desiredClass);
- } // TSingleObjectIterator::CountElements
-
- //----------------------------------------------------------------------------------------
- // TSingleObjectIterator::GetIndexedElement
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TSingleObjectIterator::GetIndexedElement(const TAETransaction& t, DescType desiredClass, long index)
- {
- TAbstractScriptableObject* result = nil;
-
- if(index == 1)
- result = fObject;
- if((result == nil) || (result->DerivedFromOSLClass(t, desiredClass) == false))
- FailErr(errAEIndexTooLarge);
-
- return result->CloneDesignator();
- } // TSingleObjectIterator::GetIndexedElement
-
-
- //========================================================================================
- // CLASS TCollectionIterator
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::~TCollectionIterator
- //----------------------------------------------------------------------------------------
- TCollectionIterator::~TCollectionIterator()
- {
- for(long i=0; i<fItersInCollection; ++i)
- {
- fIterCollection[i]->Release();
- }
- if(fIterCollection != nil)
- delete [] fIterCollection;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::AddIterator
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::AddIterator(TAbstractObjectIterator* iter)
- {
- if(fItersInCollection >= fCollectionSize)
- {
- long newCollectionSize = fCollectionSize << 1;
- if(newCollectionSize == 0)
- newCollectionSize = 8;
-
- TAbstractObjectIterator** newIterCollection = new TAbstractObjectIterator*[newCollectionSize];
- if(fIterCollection != nil)
- {
- CopyMemory(fIterCollection, newIterCollection, fCollectionSize * sizeof(Ptr)); // memcpy(newIterCollection, fIterCollection, fCollectionSize * sizeof(Ptr));
- delete [] fIterCollection;
- }
- fIterCollection = newIterCollection;
- fCollectionSize = newCollectionSize;
- }
-
- fIterCollection[fItersInCollection] = iter;
- ++fItersInCollection;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::AddObject
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::AddObject(const TAETransaction& t, TAbstractScriptableObject* object)
- {
- TAbstractObjectIterator* iter = object->DirectObjectIterator(t);
- if(iter != nil)
- this->AddIterator(iter);
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::AddElementsOfObject
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::AddElementsOfObject(const TAETransaction& t, TAbstractScriptableObject* object)
- {
- TAbstractObjectIterator* iter = object->ElementIterator(t);
- if(iter != nil)
- this->AddIterator(iter);
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::CurrentIterator
- //----------------------------------------------------------------------------------------
- TAbstractObjectIterator* TCollectionIterator::CurrentIterator() const
- {
- TAbstractObjectIterator* iter = nil;
-
- if((fCurrentIter >= 0) && (fCurrentIter < fItersInCollection))
- iter = fIterCollection[fCurrentIter];
-
- return iter;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::Reset
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::Reset(const TAETransaction& t, Boolean iterationDirection /*= kForwardIteration*/)
- {
- fDirection = iterationDirection;
-
- if(fDirection == kForwardIteration)
- {
- fCurrentIter = 0;
- }
- else
- {
- fCurrentIter = fItersInCollection - 1;
- }
- TAbstractObjectIterator* iter = this->CurrentIterator();
- if(iter)
- {
- iter->Reset(t, fDirection);
- while(iter && (iter->More(t) == false))
- {
- if(fDirection == kForwardIteration)
- ++fCurrentIter;
- else
- --fCurrentIter;
- iter = this->CurrentIterator();
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::More
- //----------------------------------------------------------------------------------------
- Boolean TCollectionIterator::More(const TAETransaction& t) const
- {
- //
- // If there is a current iterator, it's More() method
- // should always return true. But we check anyway.
- //
- TAbstractObjectIterator* iter = this->CurrentIterator();
- if(iter)
- return iter->More(t);
- else
- return false;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::Next
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::Next(const TAETransaction& t)
- {
- TAbstractObjectIterator* iter = this->CurrentIterator();
- if(iter)
- {
- iter->Next(t);
- while(iter && (iter->More(t) == false))
- {
- if(fDirection == kForwardIteration)
- ++fCurrentIter;
- else
- --fCurrentIter;
- iter = this->CurrentIterator();
- if(iter != nil)
- iter->Reset(t, fDirection);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::Current
- //----------------------------------------------------------------------------------------
- TAbstractScriptableObject* TCollectionIterator::Current(const TAETransaction& t)
- {
- TAbstractObjectIterator* iter = this->CurrentIterator();
- if(iter)
- return iter->Current(t);
- else
- return nil;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::CurrentDerivedFromOSLClass
- //----------------------------------------------------------------------------------------
- Boolean TCollectionIterator::CurrentDerivedFromOSLClass(const TAETransaction& t, DescType objectClass)
- {
- TAbstractObjectIterator* iter = this->CurrentIterator();
- if(iter)
- return iter->CurrentDerivedFromOSLClass(t, objectClass);
- else
- return false;
- }
-
- //----------------------------------------------------------------------------------------
- // TCollectionIterator::SearchDeep
- //----------------------------------------------------------------------------------------
- void TCollectionIterator::SearchDeep(const TAETransaction& t, TAbstractCollector* collector, DescType desiredClass, TAbstractSearchSpec* searchSpec)
- {
- this->RecursiveSearchDeep(t, collector, desiredClass, searchSpec);
- }
-